using System;
using System.Collections.Generic;
using System.Text;
using App.Modelo;
using App.Modelo.Interfaces;

namespace App.Controlador
{
    public class ControladoraClientes : ControladoraBase
    {
        public App.Modelo.Cliente select()
        {
            App.Modelo.Cliente cliente = Repositorio.GetById<App.Modelo.Cliente>("1");
            return cliente;
        }

        public void alta(App.Modelo.Cliente cliente)
        {
            Repositorio.SaveObject(cliente);
        }

        public void modificar(App.Modelo.Cliente cliente)
        {
            Repositorio.SaveObject(cliente);
        }

        public IList<Cliente> buscar()
        {
            return Repositorio.GetList<Cliente>("from Cliente");
        }
        
        public IList<Cliente> buscar(string Nombre, IDocumento Documento, string Domicilio)
        {

            IDictionary<string, string> param = new Dictionary<string, string>();

            string where = "";

            if (Nombre != "")
            {
                where += "(cliente.NombreFantasia like :nombre OR cliente.RazonSocial like :nombre)";
                param.Add("nombre", Nombre);
            }
            if (Documento != null)
            {
                if (where != "")
                    where += " AND ";
                where += "(cliente.Documento.Numero = :numero)";

                param.Add("numero", Documento.Numero);
            }

            if (Domicilio != "")
            {
                if (where != "")
                    where += " AND ";
                where += "(cliente.Domicilio like :domicilio";
                param.Add("domicilio", Domicilio);
            }
            
            if (where != "")
                where = "WHERE " + where;

            string hql = "from Cliente as cliente " + where;


            return Repositorio.GetList<Cliente>(hql, param);

        }


        public void AsociarUsuario(Cliente Cliente, Usuario Usuario)
        {
            UsuarioCliente UsuarioCliente = new UsuarioCliente(Cliente, Usuario);
            Repositorio.SaveObject(UsuarioCliente);
        }
            
        /**
         * Obtiene los clientes asociados al usuario traves del usuario
         */
        public IList<Cliente> List(Usuario Usuario)
        {
            IDictionary<string, object> param = new Dictionary<string, object>();
            param.Add("usuario", Usuario);

            IList<Cliente> list = Repositorio.GetList<Cliente>(@"
                select uc.Cliente 
                from UsuarioCliente uc 
                where uc.Usuario = :usuario
            ", param);
            return list;
        }

    }
}